import cv2
import numpy as np


# 直方图绘制函数
def draw_hist(image, color):
    """
    绘制直方图
    :param image: 哪个图的直方图图像（灰度化之后的）
    :param color: 直方图柱子什么颜色，BGR元组
    :return: 直方图图像
    """
    hist = cv2.calcHist(
        [image],  # 计算直方图的图像，支持多图像输入，因此一个图像也要写成列表
        [0],  # 要计算的图像灰度值通道需要，灰度图直接传0
        None,  # 掩膜，全图计算不需要
        [256],  # 直方图x轴的精细程度，256表示分为256份
        [0, 255]  # x轴的范围
    )
    print(hist.shape)  # (256, 1) 256表示有256个灰度频数数据
    # 提取关键数据
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(hist)
    # print('min_val:', min_val)  # 0.0，最小的灰度频数
    print('max_val:', max_val)  # 471606.0，最大的灰度频数
    # print('min_loc:', min_loc)  # (0, 255)，最小的灰度频数对应的灰度值
    # print('max_loc:', max_loc)  # (0, 1)，最大的灰度频数对应的灰度值
    # 创建一张纯黑图，画柱子
    hist_img = np.zeros([256, 256, 3], np.uint8)
    # 为了让y轴最高的柱子留一部门空白，最高柱子的高度
    hpt = int(256 * 0.9)
    for h in range(256):  # 从0到255，每个灰度画柱子
        # 柱子高度（整数） = 直方图的最高值hpt * 每个灰度的频数/最高的频数
        intensity = int(hpt * hist[h] / max_val)
        # print(intensity)
        # 画柱子（线）
        cv2.line(
            hist_img,
            (h, 256),  # x轴的起始点
            (h, 256 - intensity),  # 线段从下往上画的终点
            color
        )
    return hist_img


if __name__ == '__main__':

    image_np = cv2.imread('kun.jpg')
    template = cv2.imread('lanqiu.jpg')
    h = template.shape[0]
    w = template.shape[1]
    print(h, w)
    res = cv2.matchTemplate(image_np, template, cv2.TM_CCOEFF_NORMED)
    print(res.max())

    threshold = 0.93

    loc = np.where(res > threshold)
    print(len(loc))
    print(res.shape)
    print(loc)
    res_max = 0
    n = 0
    for i in range(0, len(loc[0])-1):
        print(i)
        # print('坐标', (x, y))
        if np.absolute(loc[0][i + 1] - loc[0][i]) < 20 and np.absolute(loc[1][i + 1] - loc[1][i]) < 20:

            if res[loc[0][i]][loc[1][i]] > res_max:
                res_max = res[loc[0][i]][loc[1][i]]
                n = i
            # print(loc[0][i])
            continue
        print(loc[0][n], loc[1][n])
        cv2.rectangle(image_np, (loc[1][n], loc[0][n]), (loc[1][n] + w, loc[0][n] + h), (0, 0, 255), thickness=1)
        n = i + 1
        res_max = 0
    cv2.imshow('', image_np)
    cv2.imwrite('zuoye7.jpg', image_np)
    cv2.waitKey(0)

